package uy.com.csi.gestpro.model.ejbbean;

import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import uy.com.csi.gestpro.model.ejbremote.InformeDiarioEjbRemote;
import uy.com.csi.gestpro.model.mantenimiento.GpEqpmnto;
import uy.com.csi.gestpro.model.proyecto.GpEqpmntoObra;
import uy.com.csi.gestpro.model.proyecto.GpFtoInfrme;
import uy.com.csi.gestpro.model.proyecto.GpInfrmeDrio;
import uy.com.csi.gestpro.model.proyecto.GpPrsnalPrycto;
import uy.com.csi.gestpro.model.proyecto.GpSbcntrtsta;
import uy.com.csi.gestpro.model.proyecto.GpTraFtra;
import uy.com.csi.gestpro.model.proyecto.GpTreaPrsnal;
import uy.com.csi.gestpro.model.view.GpVwActvdadPrsnal;
import uy.com.csi.gestpro.model.view.GpVwCmpraInfrme;
import uy.com.csi.gestpro.model.view.GpVwEqpmto;
import uy.com.csi.gestpro.model.view.GpVwPrsnalPrycto;
import uy.com.csi.gestpro.util.Constante;

@Stateless
public class InformeDiarioEjb implements InformeDiarioEjbRemote {
	@PersistenceContext(name = "pu_gestpro")
	EntityManager em;

	public InformeDiarioEjb() {
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<GpInfrmeDrio> getInformeDiarioList() {
		List<GpInfrmeDrio> infDiarioLst = null;
		try {
			String consulta = "select id from GpInfrmeDrio id order by id.fchaInfrme desc";
			Query q = em.createQuery(consulta);
			infDiarioLst = (List<GpInfrmeDrio>) q.getResultList();
		} catch (Exception e) {
		}
		return infDiarioLst;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<GpVwCmpraInfrme> getCmpraByInfrme(Integer idInforme) {
		List<GpVwCmpraInfrme> cmpraInfrmes = null;
		try {
			String consulta = "select cmp from GpVwCmpraInfrme cmp where cmp.idInfrmeDrio=:idInfrmeDrio";
			Query q = em.createQuery(consulta);
			q.setParameter("idInfrmeDrio", idInforme);
			cmpraInfrmes = (List<GpVwCmpraInfrme>) q.getResultList();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return cmpraInfrmes;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<GpFtoInfrme> getFtoByInfrme(Integer idInfrme) {
		List<GpFtoInfrme> ftoInfrmes = null;
		try {
			String consulta = "select fto from GpFtoInfrme fto where fto.gpInfrmeDrio.id=:id";
			Query q = em.createQuery(consulta);
			q.setParameter("id", idInfrme);
			ftoInfrmes = (List<GpFtoInfrme>) q.getResultList();

			if (ftoInfrmes.isEmpty()) {
				GpFtoInfrme fotoEmpty = new GpFtoInfrme();
				fotoEmpty.setId(Constante.ID_EMPTY);
				fotoEmpty.setNmbre(Constante.NOMBRE_IMAGEN_EMPTY);
				fotoEmpty.setObsrvcion(Constante.OBSERVACION_IMAGEN_EMPTY);
				ftoInfrmes.add(fotoEmpty);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ftoInfrmes;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<GpInfrmeDrio> getInformeDiarioList(Integer idProyecto, Integer idUsuario) {
		List<GpInfrmeDrio> drios = null;
		try {
			String consulta = "select id from GpInfrmeDrio id where id.gpPrycto.id=:id ";
			if (idUsuario != null) {
				consulta += "and id.idUsrio=:idUsuario ";
			}
			consulta += "and id.estdo=:estdo order by id.fchaInfrme desc";

			Query q = em.createQuery(consulta);
			q.setParameter("id", idProyecto);
			q.setParameter("estdo", true);
			
			if(idUsuario!=null){
				q.setParameter("idUsuario", idUsuario);
			}
			
			drios = (List<GpInfrmeDrio>) q.getResultList();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return drios;
	}

	@Override
	public boolean elmnarInfrme(Integer idInfrme) {
		try {
			String consulta = "update GpInfrmeDrio id set id.estdo=:estdo where id.id=:id";
			Query q = em.createQuery(consulta);
			q.setParameter("id", idInfrme);
			q.setParameter("estdo", false);
			q.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

	@Override
	public Integer getMaxInfrmeDrio() {
		Integer id = 1;
		try {
			String sql = "select max(id.id) from GpInfrmeDrio id";
			Query q = em.createQuery(sql);
			id = (Integer) q.getSingleResult();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return id;
	}

	@Override
	public GpInfrmeDrio persistInformeDiario(GpInfrmeDrio gpInfDrio) {
		try {
			gpInfDrio.setId(null);
			em.persist(gpInfDrio);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return gpInfDrio;
	}

	@Override
	public GpInfrmeDrio mergeInformeDiario(GpInfrmeDrio gpInfDrio) {
		try {
			em.merge(gpInfDrio);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return gpInfDrio;
	}

	@Override
	public int removeSubCont(List<GpSbcntrtsta> subcontr) {
		try {
			if (subcontr != null && !subcontr.isEmpty()) {
				for (GpSbcntrtsta sb : subcontr) {
					String sql = "DELETE FROM GpSbcntrtsta sb WHERE sb.id=:id";
					Query q = em.createQuery(sql);
					q.setParameter("id", sb.getId());
				}
			}
			return 1;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return 0;
	}

	@Override
	public int addSubCont(List<GpSbcntrtsta> subcontr, GpInfrmeDrio infDrio) {
		try {
			if (subcontr != null && !subcontr.isEmpty()) {
				for (GpSbcntrtsta sb : subcontr) {
					if (sb.getId().compareTo(0) < 0) {
						sb.setId(null);
						sb.setGpInfrmeDrio(infDrio);
						em.persist(sb);
					}
				}
			}
			return 1;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return 0;
	}

	@Override
	public int mergeEquipamiento(List<GpVwEqpmto> eqLst) {
		try {
			if (eqLst != null && !eqLst.isEmpty()) {
				for (GpVwEqpmto eq : eqLst) {
					String consulta = "update GpEqpmntoObra e set e.vlor=:vlor where e.id=:id";
					Query q = em.createQuery(consulta);
					q.setParameter("vlor", eq.getVlor());
					q.setParameter("id", eq.getIdentificador());
					q.executeUpdate();
				}
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return 0;
	}

	@Override
	public int addEquipamiento(List<GpVwEqpmto> eqLst, GpInfrmeDrio infDrio) {
		try {
			if (eqLst != null && !eqLst.isEmpty()) {
				for (GpVwEqpmto eq : eqLst) {
					GpEqpmntoObra eqo = new GpEqpmntoObra();
					eqo.setGpInfrmeDrio(infDrio);
					eqo.setId(null);
					eqo.setIdEqpmnto(eq.getIdEqpmnto());
					eqo.setVlor(eq.getVlor());
					em.persist(eqo);
				}
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return 0;
	}

	@Override
	public int addRemoveOperario(List<GpVwPrsnalPrycto> listOperario, GpInfrmeDrio infDrio) {
		try {
			for (GpVwPrsnalPrycto p : listOperario) {

				// Eliminando
				String sql = "delete from GpTreaPrsnal tp where tp.gpPrsnalPrycto.id=:idPer ";
				if (p.getGpActvdadPrsnals() != null && !p.getGpActvdadPrsnals().isEmpty()) {
					sql += "and tp.gpTrFtra.id not in (:i0 ";
					for (int i = 1; i < p.getGpActvdadPrsnals().size(); i++) {
						sql += ", :i" + i;
					}
					sql += ")";
				}
				Query q = em.createQuery(sql);
				q.setParameter("idPer", p.getId());
				if (p.getGpActvdadPrsnals() != null && !p.getGpActvdadPrsnals().isEmpty()) {
					for (int i = 0; i < p.getGpActvdadPrsnals().size(); i++) {
						q.setParameter("i" + i, p.getGpActvdadPrsnals().get(i).getIdTraFtra());
					}
				}
				q.executeUpdate();

				// Agregando
				if (p.getGpActvdadPrsnals() != null && !p.getGpActvdadPrsnals().isEmpty()) {
					for (GpVwActvdadPrsnal a : p.getGpActvdadPrsnals()) {
						if (a.getId().compareTo(0) < 0) {
							GpTreaPrsnal tp = new GpTreaPrsnal();

							tp.setId(null);

							GpPrsnalPrycto pp = new GpPrsnalPrycto();
							pp.setId(p.getId());
							tp.setGpPrsnalPrycto(pp);

							GpTraFtra tt = new GpTraFtra();
							tt.setId(a.getIdTraFtra());
							tp.setGpTraFtra(tt);

							tp.setGpInfrmeDrio(infDrio);

							em.persist(tp);
						}
					}
				}
			}
			return 1;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return 0;
	}

}
